// 用于存储用户信息与相关数据的仓库

import { defineStore } from "pinia";
import { ref } from "vue"
import { loginAPI, getUserInfoAPI } from "@/api/user"
import { setToken, getToken, removeToken } from "@/utils/token";

// 创建并导出用户数据仓库
export const useUserStore = defineStore("user", () => {
    // token
    // -- 优先从本地仓库取，若是本地不存在则赋值为空字符串
    const token = ref(getToken() || "")
    // 用户信息
    const userInfo = ref({})

    // 设置token
    const setPiniaToken = (tk) => {
        token.value = tk
    }
    // 登录
    const login = async (loginFormData) => {
        // 获取响应数据
        // -- 下述方法登陆失败时会抛出错误，后续代码将不再执行
        // -- 我们需要对错误进行处理
        const resp = await loginAPI(loginFormData)
        // 设置token
        const tk = resp.token
        setPiniaToken(tk)
        setToken(tk)
    }
    // 设置用户信息
    const setUserInfo = (ui) => {
        userInfo.value = ui
    }
    // 获取用户信息
    const getUserInfo = async () => {
        /**
         * 若是token失效，此处会抛出异常
         * 但是异常我们已经在响应拦截器中处理过了
         * 因此，此处直接捕获异常即可
         */
        try{
            // 请求获取数据
            const ui = await getUserInfoAPI()
            // 存储至pinia仓库中
            setUserInfo(ui)
        } catch(e) {

        }
    }
    // 退出登录
    const logout = () => {
        // 清除pinia与本地中的token、用户信息
        token.value = ''
        removeToken()
        userInfo.value = {}
    }

    return {
        token,
        userInfo,
        login,
        getUserInfo,
        logout
    }
})